#include <iostream>
#include <vector>
using namespace std;

const int MAX = 21;

// 判断是否越界
bool IsValid(int x, int y, int n, int m) {
    return x >= 0 && x <= n && y >= 0 && y <= m;
}

// 递归
long long GetSum(int x, int y, int n, int m, vector<vector<bool>>& banned, 
    vector<vector<long long>>& cache) {
    if (!IsValid(x, y, n, m) || banned[x][y]) {
        return 0;
    }
    if (x == 0 && y == 0) {
		return 1; // 到达起点
    }

    if (cache[x][y] != -1) {
        return cache[x][y];
    }

    long long sum = 0;
    if (IsValid(x - 1, y, n, m)) {
        sum += GetSum(x - 1, y, n, m, banned, cache);
    }
    if (IsValid(x, y - 1, n, m)) {
        sum += GetSum(x, y - 1, n, m, banned, cache);
    }

    cache[x][y] = sum;
    return sum;
}


/**
 * https://www.luogu.com.cn/problem/P1002
 * 过河卒
 */
int main() {
    int n, m, hx, hy;
    cin >> n >> m >> hx >> hy;

    // 控制区域标记
    vector<vector<bool>> banned(MAX, vector<bool>(MAX, false));
    vector<vector<long long>> cache(MAX, vector<long long>(MAX, -1));

    // 马控制的 8 个方向
    vector<vector<int>> horseMoves = {
        {1,2}, {2,1}, {-1,2}, {-2,1},
        {-1,-2}, {-2,-1}, {1,-2}, {2,-1}
    };

    // 标记马自己的位置
    if (IsValid(hx, hy, n, m)) {
        banned[hx][hy] = true;
    }

    // 标记马控制的所有点
	for (int i = 0; i < horseMoves.size(); i++) {
		int newX = hx + horseMoves[i][0];
		int newY = hy + horseMoves[i][1];
		if (IsValid(newX, newY, n, m)) {
			banned[newX][newY] = true;
		}
	}

    cout << GetSum(n, m, n, m, banned, cache);
    return 0;
}
